package com.ruoyi.web.controller.system;


import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.exception.file.InvalidExtensionException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.domain.MemberDetailDTO;
import com.ruoyi.system.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/system/member")
public class TMemberController extends BaseController {
    @Autowired
    private ITMemberService memberService;
    @Autowired
    private ISysUserService userService;
    @Autowired
    private ISysDeptService deptService;
    @Autowired
    private ISysPostService postService;
    @Autowired
    private ISysRoleService roleService;
    @Autowired
    private TokenService tokenService;


    /*C端*/
    /*根据会员id查询会员信息，
    * 1-根据会员id回显会员信息，
    * 2-在根据用户id，查询用户基本信息：性别、电话号码
    * 3-根据用户id查询部门信息
    * 4-根据用户id查询岗位信息，user_post表，查post表*/
    @PreAuthorize("@ss.hasPermi('system:member:query')")
    @GetMapping(value = "/{userId}")
    public AjaxResult selectMemberDetailById(@PathVariable Long userId){
        Long memberId=userService.selectMemberIdByUserId(userId);
        MemberDetailDTO memberDetailDTO = memberService.selectMemberDetailById(memberId);
        return success(memberDetailDTO);
    }

    /*申请入会，信息回显*/
    /*根据id查询用户表中的头像、姓名、性别、联系方式
     * 查询部门id和名称
     * 查询岗位id和岗位名称
     * */
    @PreAuthorize("@ss.hasPermi('system:member:query')")
    @GetMapping(value = { "/select", "/select/{userId}" })
    public AjaxResult selectMemberDetail(@PathVariable(value = "userId", required = false) Long userId){
        AjaxResult ajax = AjaxResult.success();
        // 查询所有部门并构建树形结构 - 新增代码
        List<SysDept> depts = deptService.selectDeptList(new SysDept());
        ajax.put("deptTree", deptService.buildDeptTreeSelect(depts));
        if (StringUtils.isNotNull(userId))
        {
            /*selectUserById这里会完成部门名称的查询*/
            SysUser sysUser = userService.selectUserById(userId);
            //将用户信息存储到ajax的data中，这里已经查询到deptid（dept数据）、姓名、图片、性别
            ajax.put(AjaxResult.DATA_TAG, sysUser);
            //根据用户id查询岗位列表
            ajax.put("postIds", postService.selectPostListByUserId(userId));
            ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
        }
        /*默认角色都是普通用户*/
        List<SysRole> roles = roleService.selectRoleAll();
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        ajax.put("posts", postService.selectPostAll());
        return ajax;
    }

    /*申请入会，信息提交*/
    /*需要提交用户id、头像、姓名、性别、联系方式、--sysuer,注意：姓名无法更改
    入会时间、会员级别、艺术成就、代表作品--member
    部门、职位、---post、dept*/
    @PreAuthorize("@ss.hasPermi('system:member:add')")
    @PostMapping
    public AjaxResult add(@Validated @RequestBody MemberDetailDTO memberDetailDTO)
    {
        //此处先不做太多数据校验测试
        /*MemberDetailDTO类封装了多个表中的信息user、dept、role、member、post*/
        //在数据库中查询该用户是否在用户表中，根据用户id进行查询，在userService中的
        Long userId = memberDetailDTO.getUser().getUserId();
        Long memberId = userService.selectMemberIdByUserId(userId);
        if (memberId!=null){
            return error("会员申请失败，"+memberDetailDTO.getUser().getUserName()+"是会员");
        }
        //如果不是会员，调用增加会员的方法
       return toAjax(memberService.insertTMemberInfo(memberDetailDTO));
    }

    /*入会申请时头像更改*/
    @PostMapping("/uploadss")
    public AjaxResult avatar(@RequestParam("file") MultipartFile file) throws IOException, InvalidExtensionException {
        /*判断文件不能为空*/
        if (!file.isEmpty())
        {
            /*获取用户信息*/
            LoginUser loginUser = getLoginUser();
            /*文件上传，RuoYiConfig.getAvatarPath()获取头像路径
             * MimeTypeUtils.IMAGE_EXTENSION只能*/
            String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION, true);
            //更新数据库
            if (userService.updateUserAvatar(loginUser.getUserId(), avatar))
            {
                /*删除旧头像*/
                String oldAvatar = loginUser.getUser().getAvatar();
                if (StringUtils.isNotEmpty(oldAvatar))
                {
                    FileUtils.deleteFile(RuoYiConfig.getProfile() + FileUtils.stripPrefix(oldAvatar));
                }
                /*构造响应：返回操作成功的AjaxResult对象
                添加新头像路径到响应数据中*/
                AjaxResult ajax = AjaxResult.success();
                ajax.put("imgUrl", avatar);
                // 更新缓存用户头像
                loginUser.getUser().setAvatar(avatar);
                tokenService.setLoginUser(loginUser);
                return ajax;
            }
        }
        return error("上传图片异常，请联系管理员");
    }


    /*删除会员信息*/
    @PreAuthorize("@ss.hasPermi('system:member:remove')")
    @DeleteMapping("/{memberIds}")
    public AjaxResult remove(@PathVariable Long[] memberIds)
    {
        //TODO
        return toAjax(memberService.deleteTMemberByMemberIds(memberIds));
    }

    /*查询会员列表*/



    /*更新会员信息*/
    /*导入会员信息*/
    /*导出会员信息*/
}
